package com.beantest.processor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class Bean4 implements InitializingBean, DisposableBean, BeanNameAware, ApplicationContextAware {

    private static final Logger logger = LoggerFactory.getLogger(Bean4.class);

    private String beanName;       // 存储Bean名称
    private ApplicationContext ctx;// 存储应用上下文

    // BeanNameAware接口实现
    @Override
    public void setBeanName(String name) {
        this.beanName = name;
        logger.info(">>>> BeanNameAware接口回调：beanName={}", name);
    }

    // ApplicationContextAware接口实现
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.ctx = applicationContext;
        logger.info(">>>> ApplicationContextAware接口回调：已注入上下文");
    }

    // 实例化
    public Bean4() {
        logger.info("Bean4 实例化");
    }

    // 初始化方法1：实现InitializingBean接口
    @Override
    public void afterPropertiesSet() {
        logger.info("Bean4 初始化（InitializingBean接口）");
    }

    // 销毁方法1：实现DisposableBean接口
    @Override
    public void destroy() {
        logger.info("Bean4 销毁（DisposableBean接口）");
    }

    // 模拟成功的事务场景
    @Transactional
    public void successfulTransaction() {
        logger.info("开始执行成功的事务操作...");
        // 模拟数据库操作
        // 这里可以调用Repository进行数据库操作
        logger.info("成功的事务操作完成");
    }

    // 模拟失败的事务场景
    @Transactional
    public void failedTransaction() {
        logger.info("开始执行失败的事务操作...");
        // 模拟数据库操作
        // 这里可以调用Repository进行数据库操作
        throw new RuntimeException("模拟事务失败");
    }
}
   